package com.itlong.cloud.commons.dao;

import com.itlong.cloud.POJO.DTO.app.AppElevatorAuthDTO;
import com.itlong.cloud.POJO.PO.AppVisitorPassCodeRecordPO;
import com.itlong.cloud.POJO.PO.DeviceCloudControllerInfoPO;
import com.itlong.cloud.POJO.PO.DeviceElevatorInfoPO;
import com.itlong.cloud.POJO.PO.PushCloudElevatorChangeLogPO;
import com.itlong.cloud.POJO.VO.property.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      云电梯业务数据访问接口
 * </desc>
 *
 * @createDate 2018/03/28
 */
@Repository
public interface ICloudElevatorDao {
    /**
     * <desc>
     *      获取设备状态
     * </desc>
     *
     * @param sn
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/28
     */
    Integer getDeviceStatus(@Param("sn")String sn);

    /**
     * <desc>
     *      根据sn获取云电梯设备缓存实体信息
     * </desc>
     *
     * @param sn
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/28
     */
    CloudElevatorVO getDeviceInfoBySn(@Param("sn")String sn);

    /**
     * <desc>
     *      更新设备的token
     * </desc>
     *
     * @param token
     * @param sn
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/29
     */
    Integer updateTokenBySn(@Param("token")String token,@Param("sn")String sn);

    /**
     * <desc>
     *      获取云电梯房间开门密码集合
     * </desc>
     *
     * @param params
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/30
     */
    List<CloudElevatorRoomPwdVO> getPullDevicePwdPage(Map<String,Object> params);

    /**
     * <desc>
     *      获取云电梯房间开门密码集合总数量
     * </desc>
     *
     * @param params
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/30
     */
    Integer getPullDevicePwdPageCount(Map<String,Object> params);

    /**
     * <desc>
     *      获取云电梯轮询业务指令
     * </desc>
     *
     * @param params
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/03
     */
    List<CloudElevatorChangeLogPageVO> getChangeLogPage(Map<String,Object> params);

    /**
     * <desc>
     *      获取云电梯轮询业务指令总数
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/03
     */
    Integer getChangeLogPageCount(String deviceUnique);

    /**
     * <desc>
     *      批量完成轮询命令
     * <desc/>
     *
     * @param deviceUnique
     * @param ids 轮询命令id列表
     * @param status 状态，0-待处理，1-处理中，2-处理完
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/03
     */
    Integer changeChangeLogOrdersStatus(@Param("deviceUnique") String deviceUnique,
                                        @Param("ids") String[] ids,
                                        @Param("status") Integer status);


    /**
     * <desc>
     *      修改设备的属性
     * </desc>
     *
     * @param deviceUnique
     * @param version
     * @param screen
     * @return
     * @author Jiaqi.X
     * @createDate 2018/11/22
     */
    Integer updatePro(Map<String,Object> proMap);

    /**
     * <desc>
     *      校验云电梯开门动态密码
     * </desc>
     *
     * @param projectId
     * @param password
     * @param floorNum
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/11
     */
    AppVisitorPassCodeRecordPO checkDynamicPwd(@Param("projectId") String projectId,
                                               @Param("password") String password,
                                               @Param("floorNum") String floorNum,
                                               @Param("buildId") String buildId,
                                               @Param("unitIds") String[] unitIds);

    /**
     * <desc>
     *      根据房间id查询房间编号
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/11
     */
    String getRoomNumByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      清空过期的轮询命令
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/19
     */
    Integer clearExpiredChangeLog(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      通过sn获取设备名称
     * </desc>
     *
     * @param sn
     * @return
     * @author Jiaqi.X
     * @createDate 2018/05/09
     */
    String getElevatorNameBySn(@Param("sn") String sn);

    /**
     * <desc>
     *      通过sn获取楼栋id
     * </desc>
     *
     * @param sn
     * @return
     * @author Jiaqi.X
     * @createDate 2018/08/01
     */
    Map<String,Object> getBuildAndUnitBySn(@Param("sn") String sn);

    /**
     * <desc>
     *      通过deviceUnique获取楼栋id
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Juguang.S
     * @createDate 2019/10/15
     */
    Map<String,Object> getBuildAndUnitByDeviceUnique(@Param("deviceUnique") String deviceUnique);


    /**
     * <desc>
     *      获取云设备的楼层映射信息
     * </desc>
     *
     * @param startFloor
     * @param endFloor
     * @return
     * @author Jiaqi.X
     * @createDate 2018/11/22
     */
    CloudDeviceFloorInfoVO getCloudDeviceFloorInfo(@Param("sn")String sn,@Param("startFloor") Integer startFloor,@Param("endFloor") Integer endFloor);

    /**
     * <desc>
     *      获取群控器的楼层映射信息
     * </desc>
     *
     * @param startFloor
     * @param endFloor
     * @return
     * @author Qiang.S
     * @createDate 2019/03/27
     */
    CloudDeviceFloorInfoVO getCloudControllerFloorInfo(@Param("sn")String sn,@Param("startFloor") Integer startFloor,@Param("endFloor") Integer endFloor);

    /**
     * <desc>
     *      根据项目编号和房间ID查询该项目下的用户是否被冻结
     * </desc>
     *
     * @return
     * @author Juguang.S
     * @createDate 2018/12/6
     */
    Integer getUserIsFrost(@Param("projectId") String projectId,@Param("roomId") String roomId);

    /**
     * <desc>
     *      根据deviceUnique号云电梯设备更新相关指令
     * <desc/>
     *
     * @param deviceUnique
     * @return
     * @author Qiang.S
     * @createDate 2019-01-16
     */
    List<CloudIntercomChangeLogOrderVO> getUpdateDeviceInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      分页查询某个云电梯设备服务的房间信息
     * <desc/>
     *
     * @param deviceUnique 设备唯一码
     * @param projectId
     * @param offset limit分页偏移量
     * @param pageSize limit分页大小
     * @return
     * @author Qiang.S
     * @createDate 2019-04-26
     */
    List<CloudElevatorDeviceAuthVO.Room> getServeRoomsPage(@Param("deviceUnique") String deviceUnique,
                                                           @Param("projectId") String projectId,
                                                           @Param("offset") Integer offset,
                                                           @Param("pageSize") Integer pageSize);
    /**
     * <desc>
     *      获取某个云电梯设备服务的房间总数
     * <desc/>
     *
     * @param deviceUnique 设备唯一码
     * @param projectId
     * @return
     * @author Qiang.S
     * @createDate 2019-04-26
     */
    Integer getServeRoomsCount(@Param("deviceUnique") String deviceUnique,
                               @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取房间下的住户信息
     * <desc/>
     *
     * @param roomIds 房间id
     * @return
     * @author Qiang.S
     * @createDate 2019-04-26
     */
    List<CloudElevatorDeviceAuthVO.RoomUser> getUsersByRoomIds(@Param("roomIds") String[] roomIds);

    /**
     * <desc>
     *      根据设备编号获取访客信息
     * </desc>
     *
     * @param deviceUnique 设备唯一码
     * @return
     * @author Qiang.S
     * @createDate 2019/04/26
     */
    List<CloudIntercomVisitorVO> getVisitorInfoByUnique(String deviceUnique);

    /**
     * <desc>
     *      通知云端升级失败原因
     * <desc/>
     *
     * @param sn
     * @param id 轮询命令id列表
     * @param status 状态，0-待处理，1-处理中，2-处理完，3-处理失败
     * @param msg 失败原因
     * @return
     * @author Qiang.S
     * @createDate 2019/08/12
     */
    Integer reportUpdateResult(@Param("sn") String sn,
                               @Param("id") String id,
                               @Param("status") Integer status,
                               @Param("msg") String msg);

    /**
     * <desc>
     *     根据房间ID查询对应的楼栋与单元ID
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/03
     */
    String deviceChangeLogGetBuildAndUnitIdByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      获取设备地址
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<String> getUnitIdsByDeviceUnique(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取用户黑名单信息
     * </desc>
     *
     * @param unitIds
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getBlackUserInfos(@Param("unitIds") List<String> unitIds,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取门禁地址下的电梯
     * </desc>
     *
     * @param map
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    List<CloudElevatorVO> getDeviceUniquesByEntranceAddress(Map<String,Object> map);

     /**
     * <desc>
     *      获取电梯临时权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    List<AppElevatorAuthDTO> getFloorAuth(@Param("userId") String userId,@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);

    /**
     * <desc>
     *      获取电梯临时权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @param deviceId
     * @return
     * @author Jugaung.S
     * @createDate 2021/03/31
     */
    List<AppElevatorAuthDTO> getFloorAuthByTemp(@Param("userId") String userId,@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);

    /**
     * <desc>
     *      获取电梯临时权限
     * </desc>
     *
     * @param projectId
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getTempBlackInfos(@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);

    /**
     * <desc>
     *      获取用户黑名单信息
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getBlackUserInfosByRoomId(@Param("roomId") String roomId,@Param("projectId")String projectId);

    /**
     * <desc>
     *      获取临时用户权限黑名单
     * </desc>
     *
     * @param roomId
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getTempBlackInfosByRoomId(@Param("roomId") String roomId,@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);

    /**
     * <desc>
     *      获取用户临时楼层权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/21
     */
    List<AppElevatorAuthDTO> getTempFloorAuth(@Param("userId") String userId,@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);


    /**
     * <desc>
     *      获取电梯临时权限
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    List<AppElevatorAuthDTO> getPushFloorAuth(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取云电梯临时权限
     * </desc>
     *
     * @param deviceId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/12
     */
    List<Map<String,Object>> getTempAuths(@Param("deviceId") Integer deviceId,@Param("projectId") String projectId);


    /**
     * <desc>
     *      获取云电梯临时权限
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/12
     */
    List<Map<String,Object>> getPushTempAuths(@Param("projectId") String projectId,@Param("userId") String userId);

    /**
     * <desc>
     *      获取云电梯临时权限用户信息
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/12
     */
    Map<String,Object> getPushTempUserInfo(@Param("projectId") String projectId,@Param("userId") String userId);


    /**
     * <desc>
     *      根据楼层权限标识获取楼层名称
     * </desc>
     *
     * @param naturalFloor
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/12
     */
    String getLogicFloorByNaturalFloor(@Param("naturalFloor") String[] naturalFloor,@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      根据权限标识获取真实楼层
     * </desc>
     *
     * @param naturalFloors
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/18
     */
    String getFloorNumByNaturalFloor(@Param("naturalFloors") String[] naturalFloors,@Param("deviceUnique") String deviceUnique);


    /**
     * <desc>
     *      校验临时权限云电梯开门动态密码
     * </desc>
     *
     * @param projectId
     * @param password
     * @return
     * @author Juguang.S
     * @createDate 2019/09/22
     */
    AppVisitorPassCodeRecordPO checkDynamicPwdForTemporartAuth(@Param("projectId") String projectId,
                                               @Param("password") String password,
                                               @Param("buildId") String buildId);

    /**
     * <desc>
     *      获取卡片黑名单信息
     * </desc>
     *
     * @param unitIds 单元
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/07/15
     */
    List<UserBlackInfoVO> getBlackCardInfos(@Param("unitIds") List<String> unitIds,@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据項目Id查询收费间隔时间
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/07/16
     */
    String getFeeConfigTimeByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *     查询指定项目下用户通行方式的最后一次通行时间
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/07/16
     */
    String getLastPassTimeByProjectId(@Param("projectId") String projectId,@Param("userId") String userId,@Param("openType") String openType);

    /**
     * <desc>
     *     查询用户的类型
     * </desc>
     *
     * @param projectId 项目编号
     * @param userId 用户编号
     * @param roomId 房间编号
     * @return
     * @author Juguang.S
     * @createDate 2020/07/16
     */
    Map<String,Object> getUserType(@Param("projectId") String projectId,@Param("userId") String userId,@Param("roomId") String roomId);

    /**
     * <desc>
     *     根据卡号查询卡号所对应的房间及次数信息
     * </desc>
     *
     * @param projectId 项目编号
     * @param cardId 卡号
     * @return
     * @author Juguang.S
     * @createDate 2020/07/17
     */
    CloudElevatorCardPassInfoVO getRoomInfoByCardId(@Param("projectId") String projectId,@Param("cardId") String cardId);

    /**
     * <desc>
     *      根据房间Id获取卡片信息
     * </desc>
     *
     * @param roomId
     * @return
     * @author Juguang.S
     * @createDate 2020/07/18
     */
    List<UserBlackInfoVO> getBlackCardByRoomId(@Param("roomId") String roomId,@Param("projectId")String projectId);

    /**
     * <desc>
     *     查询电梯计费模式的状态
     * </desc>
     *
     * @param sn 设备sn
     * @return
     * @author Juguang.S
     * @createDate 2020/07/20
     */
    Integer getEquipModeBySn(@Param("sn") String sn);

    /**
     * <desc>
     *      根据房间Id获取房间没次数的卡片信息
     * </desc>
     *
     * @param roomId
     * @param projectId
     * @return
     * @author Juguang.S
     * @createDate 2020/07/21
     */
    List<UserBlackInfoVO> getBlackCardNoCountByRoomId(@Param("roomId") String roomId,@Param("projectId")String projectId);

    /**
     * <desc>
     *     根据项目编号查询收费模式开启配置
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/07/30
     */
    Map<String,Object> getChargeModeByProjectId(@Param("projectId") String projectId,@Param("cardId") String cardId);


    /**
     * <desc>
     *    获取产品类型代码
     * </desc>
     *
     * @param  deviceAttributes  产品型号值
     * @return  String           产品类型代码
     * @Author pengwei
     * @createDate  2020/11/18
     */
    String   getProductCode(@Param("deviceAttributes") String   deviceAttributes);


    /**
     * <desc>
     *      云电梯是否存在
     * </desc>
     *
     * @param deviceUnique   设备唯一码
     * @return
     * @author pengwei
     * @createDate 2020/11/18
     */
    String getElevatorDeviceExist(@Param("deviceUnique") String deviceUnique);


    /**
     * <desc>
     *      修改设备的属性
     * </desc>
     *
     * @param deviceUnique      设备信息
     * @return
     * @author pengwei
     * @createDate 2020/11/18
     */
    Integer updateSpecialPro(Map<String,Object> proMap);
    /**
     * <desc>
     *      根据sn 获取电梯信息
     * </desc>
     *
     * @param
     * @return
     * @author caoshuai
     * @createDate 2020/11/20 18:27
     */
    DeviceElevatorInfoPO getElevatorInfoBySn(Map<String, Object> param);

    /**
     * <desc>
     *      根据sn 获取群控器信息
     * </desc>
     *
     * @param
     * @return
     * @author caoshuai
     * @createDate 2020/11/23 18:27
     */
    DeviceCloudControllerInfoPO getControllerInfoBySn(@Param("sn") String sn);

    /**
     * <desc>
     *     获取设备预警次数
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/12/24
     */
    Integer getWarningTimesByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *     为了去重未消费的指令，在保存前需查下数据库是否有相同指令
     * </desc>
     *
     * @param deviceUnique 设备编号
     * @return
     * @author Juguang.S
     * @createDate 2020/12/24
     */
    Integer getIsSameData(@Param("deviceUnique") String deviceUnique,
                          @Param("commandData") String commandData);

    /**
     * <desc>
     *     为了去重未消费的指令，在保存前需查下数据库是否有相同指令 此处查询下该用户类型为临时权限有没未消费的指令，如有则将状态改为已消费
     * </desc>
     *
     * @param userId 用户编号
     * @return
     * @author Juguang.S
     * @createDate 2020/12/24
     */
    Integer updateUntreatedCommand(@Param("userId") String userId,
                                   @Param("sn") String sn);

    /**
     * <desc>
     *      批量保存
     * </desc>
     *
     * @param params 待保存的信息列表
     * @return 受影响的行数
     * @author Juguang.S
     * @createDate 2021/05/28
     */
    Integer batchSave(List<Map<String, Object>> params);

    /**
     * <desc>
     *      保存推送消息表
     * </desc>
     *
     * @param params 待保存的信息列表
     * @return 受影响的行数
     * @author Juguang.S
     * @createDate 2021/05/28
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      批量修改订
     * </desc>
     *
     * @param list
     * @return
     * @author Juguang.S
     * @createDate  2020/12/22
     */
    Integer batchUpdate(List<Map<String, Object>> list);

    /**
     * <desc>
     *      查询云电梯所绑定的摄像头相关参数配置
     * </desc>
     *
     * @param deviceUnique 电梯设备唯一编码
     * @return
     * @author Juguang.S
     * @createDate 2021/05/31
     */
    DeviceAiCameraInfoVO getAiCameraInfoByElevatorDeviceUnique(@Param("deviceUnique") String deviceUnique);

}
